package com.study.hot.jetpack.hilt.module

import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ApplicationComponent
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

/**
 * <pre>
 *     author : slx
 *     time   : 2020/11/24
 *     desc   : 注入第三方(第三方无法修改代码，无法添加相关注解，需要借助module)
 * </pre>
 */
@Module
@InstallIn(SingletonComponent::class)
class NetWorkModule {
    // hilt默认每次注入都创建新的实例，有些情况不符合实际，可以使用作用域注解
    // @Singleton单例，还有其他作用域例如：@ActivityScoped(在Activity作用域使用)
    // 作用域范围注解不仅可以用在module中，也可以用在可注入类中
    @Singleton
    @Provides
    fun provideOkHttpClient(): OkHttpClient {
        return OkHttpClient.Builder()
                .connectTimeout(20, TimeUnit.SECONDS)
                .readTimeout(20, TimeUnit.SECONDS)
                .writeTimeout(20, TimeUnit.SECONDS)
                .build()
    }

    // 方法中的okHttpClient hilt自动注入，前提是有提供OkttpClient的方法，如上述provideOkHttpClient
    @Singleton
    @Provides
    fun provideRetrofit(okHttpClient: OkHttpClient): Retrofit {
        return Retrofit.Builder()
                .addConverterFactory(GsonConverterFactory.create())
                .baseUrl("https://api.github.com")
                .client(okHttpClient)
                .build()
    }
}